package com.example.designpatterns.behavioral.template;

/**
 * 咖啡饮品抽象类
 *
 * @author scott
 */
public abstract class CoffeeBeverage {

    /**
     * 模板方法，定义制作咖啡饮品的流程
     */
    public final void prepareBeverage() {
        boilWater();
        brewCoffee();
        pourIntoCup();
        addCondiments();
        if (customerWantsExtras()) {
            addExtras();
        }
    }

    /**
     * 具体方法：将水煮沸
     */
    private void boilWater() {
        System.out.println("将水煮沸");
    }

    /**
     * 抽象方法：冲泡咖啡
     */
    protected abstract void brewCoffee();

    /**
     * 具体方法：将饮品倒入杯子中
     */
    private void pourIntoCup() {
        System.out.println("将饮品倒入杯子中");
    }

    /**
     * 抽象方法：添加配料
     */
    protected abstract void addCondiments();

    /**
     * 钩子方法，子类可以选择性实现：客户是否有额外要求
     */
    protected boolean customerWantsExtras() {
        return true;
    }

    /**
     * 钩子方法，子类可以选择性实现：添加额外的配料
     */
    protected void addExtras() {
        System.out.println("添加额外的配料");
    }

}
